import os
import sys
from argparse import ArgumentParser


class Install:
	def __init__(self, bin_path: str, port: int, addr: str, static_: str, build: bool):
		"""
		初始化函数，用于设置对象的初始属性。

		Args:
			bin_path (str): 二进制文件的路径，通常用于指定可执行文件的位置。
			port (int): 端口号，用于网络通信或服务监听。
			addr (str): 地址，通常用于指定网络通信的目标地址或服务绑定的地址。
			static_ (str): 静态标志，用于指示某些配置或行为是否为静态的。
			build (bool): 构建标志，用于指示是否需要构建二进制文件。
		"""
		self.build = build
		self.bin_path = bin_path
		self.port = port
		self.addr = addr
		self.static_ = static_

	def CreateService(self):
		"""
		创建一个systemd服务文件，并启用和启动该服务。

		:return: None, 该函数没有返回值，但会在成功时打印相关信息，失败时退出程序。
		"""
		txt = f"""
[Unit]
Description=Network Troubleshooting
After=network.target
[Service]
Type=simple
ExecStart={self.bin_path} -p {self.port} -a {self.addr} -s {self.static_}
Restart=always
[Install]
WantedBy=multi-user.target
Alias=network-troubleshooting.service
		"""
		file = "/etc/systemd/system/network-troubleshooting.service"

		# 检查服务文件是否已存在，如果存在则直接返回
		if os.path.exists(file):
			print("Service file already exists")
			return

		# 尝试创建服务文件
		try:
			with open(file, "w") as f:
				f.write(txt)
				print("Service file created")
		except Exception as e:
			print("Error creating service file: ", e)
			sys.exit(1)

		# 重新加载systemd配置
		try:
			os.system("systemctl daemon-reload")
			print("Systemd reloaded")
		except Exception as e:
			print("Error reloading systemd: ", e)
			sys.exit(1)

		# 启用服务
		os.system("systemctl disable network-troubleshooting.service > /dev/null")

		try:
			os.system("systemctl enable network-troubleshooting.service")
			print("Service enabled")
		except Exception as e:
			print("Error enabling service: ", e)
			sys.exit(1)

		# 重启服务
		try:
			os.system("systemctl restart network-troubleshooting.service")
			print("Service restarted")
		except Exception as e:
			print("Error restarting service: ", e)
			sys.exit(1)

	def build_run(self):
		# 检查main.go文件是否存在，如果不存在则退出程序
		if not os.path.exists("main.go"):
			print("main.go not found")
			sys.exit(1)
		# 开始获取依赖
		if os.system("go mod tidy") != 0:
			print("Error getting dependencies")
			sys.exit(1)
		# 开始编译
		if os.system(f"go build -o {self.bin_path} main.go") != 0:
			print("Error compiling")
			sys.exit(1)

	def start(self):
		"""
		启动服务的主要函数。该函数依次调用 `build()` 和 `CreateService()` 方法，
		分别用于构建服务和创建服务实例。

		该函数没有参数，也没有返回值。
		"""
		if self.build:
			self.build_run()  # 构建服务，准备必要的资源和配置
		self.CreateService()  # 创建服务实例，启动服务


if __name__ == "__main__":
	# 获取当前工作目录路径
	pwd = os.getcwd()
	# 拼接静态资源路径，默认在当前工作目录下的 "static" 文件夹
	static_path = os.path.join(pwd, "static")

	# 创建 ArgumentParser 对象，用于解析命令行参数
	arg = ArgumentParser(description='坐公交也用券', prog="网络排查安装")
	# 添加端口号参数，默认值为 8085
	arg.add_argument("-p", "--port", type=int, default=8085, help="端口号")
	# 添加监听地址参数，默认值为 "0.0.0.0"
	arg.add_argument("-a", "--addr", type=str, default="0.0.0.0", help="监听地址")
	# 添加静态资源路径参数，默认值为当前工作目录下的 "static" 文件夹
	arg.add_argument("-s", "--static", type=str, default=static_path, help="静态资源路径")
	# 添加二进制文件路径参数，默认值为 "/usr/sbin/network-troubleshooting"
	arg.add_argument("-b", "--bin", type=str, default="/usr/sbin/network-troubleshooting", help="二进制文件路径")
	arg.add_argument("-v", "--version", action="version", version="%(prog)s 1.0")
	arg.add_argument("-build", action="store_true", help="是否编译二进制文件")
	# 解析命令行参数并存储在 args 变量中
	args = arg.parse_args()
	# 打印解析后的参数
	print(args)
	# 创建 Install 对象，传入二进制文件路径、端口号、监听地址和静态资源路径
	install = Install(bin_path=args.bin, port=args.port, addr=args.addr, static_=args.static, build=args.build)
	# 启动安装过程
	install.start()
